package process

import (
	"encoding/json"
	"errors"
	"fmt"
	"my-go-chat/message"
	"my-go-chat/model"
	"my-go-chat/utils"
	"net"
)

type SmsProcess struct {
	//面向对象的编程思路
	//暂时不需要字段
}

//转发消息
func (sp *SmsProcess) SendGroupMes(mes *message.Message) (err error) {
	//不用构建了 可以直接对得到的对象进行群发
	//遍历夫妻的onlineUsers
	//将消息转发取出
	//这里为了使 发送消息携带发送人名字 添加一步 在dao中查询id的name 后一起携带发送

	var smsMes message.SmMes
	err = json.Unmarshal([]byte(mes.Data), &smsMes)
	if err != nil {
		return fmt.Errorf("转发消息 反序列化失败！ %w", err)
	}
	//这里时要构造发送的数据
	//利用userdao 拿到发送人名字信息

	user, _ := model.MyUserDao.GetUserById(smsMes.UserId)
	var retMes message.Message
	retMes.Type = message.SmsMesType
	smsMes.UserName = user.UserName //这里可不要直接给用户密码 那就信息泄露了
	data, err := json.Marshal(smsMes)
	if err != nil {
		return fmt.Errorf("转发消息 序列化1 失败！ %w", err)
	}
	mes.Data = string(data)
	data, err = json.Marshal(mes)
	if err != nil {
		return fmt.Errorf("转发消息 序列化2 失败！ %w", err)
	}

	//这里利用解包后的数据，对转发的对象筛选
	var errHapenOrNot bool = false            //判断是否发生错误，如果发生就返回
	for id, up := range UserMgr.onlineUsers { //自已也在里面

		if id == smsMes.UserId { //过滤 消息的来源
			continue
		}
		err = sp.SendMesToEachOnlineUser(data, up.Conn)
		if err != nil {
			errHapenOrNot = true
		}
	}
	if errHapenOrNot {
		return errors.New(" 群体转发消息时发生异常! ")
	} else {
		return
	}
}

func (sp *SmsProcess) SendMesToEachOnlineUser(data []byte, conn net.Conn) (err error) {
	//创建tf 实例 对data进行发送给
	tf := &utils.Transfer{
		Conn: conn,
	}
	err = tf.WritePkg(data)
	if err != nil {
		return fmt.Errorf("转发群发消息时 发生异常")
	}
	return
}
